package demo.java.lang.management;

import demo.javax.management.ObjectNameDemo;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;

/**
 * 用于操作系统的管理接口，Java 虚拟机在此操作系统上运行。
 * 
 * Java 虚拟机具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean，可以通过调用
 * ManagementFactory.getOperatingSystemMXBean() 方法或从平台 MBeanServer 方法获得。
 * 
 * 用于在 MBeanServer 中唯一标识操作系统的 MXBean 的 ObjectName 为：
 * 
 * java.lang:type=OperatingSystem 此接口定义了几种便捷方法，可使用这些方法访问关于操作系统（Java
 * 虚拟机在其上运行）的系统属性。
 * 
 */
public class OperatingSystemMXBeanDemo {

    static Logger logger = LoggerFactory.getLogger(OperatingSystemMXBeanDemo.class);

    @Test
    public void test() {
        OperatingSystemMXBean osMXBean = ManagementFactory.getOperatingSystemMXBean();
        printOperatingSystemMxBean(osMXBean);
        ObjectNameDemo.printObjectName(osMXBean.getObjectName());
    }

    /**
     * 打印属性
     * 
     * @param operatingSystemMxBean
     */
    public static void printOperatingSystemMxBean(OperatingSystemMXBean operatingSystemMxBean) {
        logger.info("OperatingSystemMXBean = {}", operatingSystemMxBean);
        // 返回操作系统的版本，此方法等效于 System.getProperty("os.name")
        logger.info("操作系统的版本， Version:{}", operatingSystemMxBean.getVersion());
        logger.info("os.name = ", System.getProperty("os.name"));
        // 返回操作系统的架构。此方法等效于 System.getProperty("os.arch")
        logger.info("操作系统的架构，Arch:{}", operatingSystemMxBean.getArch());
        logger.info("os.arch = ", System.getProperty("os.arch"));
        // 返回操作系统名称,此方法等效于 System.getProperty("os.version")
        logger.info("操作系统名称，Name:{}", operatingSystemMxBean.getName());
        logger.info("os.version = ", System.getProperty("os.version"));
        // 返回 Java 虚拟机可以使用的处理器数目。此方法等效于 Runtime.availableProcessors() 方法
        // 该值在特定的虚拟机调用期间可能发生更改。
        logger.info("Java 虚拟机可以使用的处理器数目，AvailableProcessors:{}", operatingSystemMxBean.getAvailableProcessors());
        logger.info("Runtime.availableProcessors() = {}", Runtime.getRuntime().availableProcessors());
        /**
         * 返回最后一分钟内系统加载平均值。
         * <p>
         * getSystemLoadAverage() 方法返回一个 double 类型的值，该值表示系统的平均负载。平均负载通常指的是系统中运行的进程或线程的活跃程度，它是一个无单位的指标，通常与 CPU 核心数相关。平均负载的值可以解释为：
         *
         * 如果平均负载小于 CPU 核心数，表示系统当前相对不繁忙。
         * 如果平均负载等于 CPU 核心数，表示系统饱和，正在以 CPU 完全利用的速度运行。
         * 如果平均负载大于 CPU 核心数，表示系统超负荷，有很多任务在排队等待执行。
         * getSystemLoadAverage() 方法可以用于监控系统负载，以便在系统资源不足时采取相应的措施，例如动态伸缩或负载平衡，以确保系统性能和稳定性。
         */
        logger.info("最后一分钟内系统加载平均值，SystemLoadAverage:{}", operatingSystemMxBean.getSystemLoadAverage());

    }
}
